package org.com.andy.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;


import org.com.andy.domain.R;
import org.com.andy.domain.dto.FlowBizKeyDto;
import org.com.andy.domain.dto.FlowQueryVo;
import org.com.andy.domain.dto.FlowStartDto;
import org.com.andy.domain.dto.FlowTaskDto;
import org.com.andy.web.domain.AjaxResult;
import org.flowable.engine.repository.ProcessDefinition;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

/**
 * @author Tony
 * @date 2021-04-03 14:41
 */
public interface IFlowDefinitionService {

    boolean exist(String processDefinitionKey);


    /**
     * 流程定义列表
     *
     * @return 流程定义分页列表数据
     */
//    Page<ProcessDefinitionVo> list(FlowQueryVo queryVo);

    /**
     * 导入流程文件
     * 当每个key的流程第一次部署时，指定版本为1。对其后所有使用相同key的流程定义，
     * 部署时版本会在该key当前已部署的最高版本号基础上加1。key参数用于区分流程定义
     *
     * @param name
     * @param category
     * @param in
     */
    ProcessDefinition importFile(String name, String category, InputStream in);


    List<ProcessDefinition> importZipFiles(String name, String category, ZipInputStream zipInputStream);

    void updateCategory(String procDefId, String category);
    /**
     * 读取xml
     *
     * @param deployId
     * @return
     */
    AjaxResult readXml(String deployId) throws IOException;

    /**
     * 根据流程定义ID启动流程实例
     *
     * @return
     */

//    R<FlowTaskDto> startProcessInstanceById(FlowStartDto flowStartDto);

    R<FlowBizKeyDto> startByBusinessKey(String procDefId, String businessId, Map<String, Object> transientVariables, Map<String, Object> variables);

    /**
     * 根据流程定义Key启动流程实例,同时绑定businessKey
     *
     * @param procDefKey
     * @param businessKey
     * @param variables
     * @return
     */
    R<FlowTaskDto> startProcessInstanceByKey(String procDefKey, String businessKey, Map<String, Object> variables);

    R<Boolean> stopProcessInstanceByKey(String businessKey);


    /**
     * 根据流程定义Key启动，with BusinessKey
     * @param flowStartDto
     * @return
     */
    AjaxResult startProcessByKeyWithBusinessKey(FlowStartDto flowStartDto);

    /**
     * 激活或挂起流程定义
     *
     * @param state    状态
     * @param deployId 流程部署ID
     */
    void updateState(Integer state, String deployId);

    /**
     * 激活流程定义
     *
     * @param deployId 流程部署ID
     */
    void activationProcess(String deployId);

    /**
     * 挂起流程定义
     *
     * @param deployId 流程部署ID
     */
    void suspendProcess(String deployId);


    /**
     * 删除流程定义
     *
     * @param deployId 流程部署ID act_ge_bytearray 表中 deployment_id值
     */
    void delete(String deployId);


    /**
     * 读取图片文件
     *
     * @param deployId
     * @return
     */
    InputStream readImage(String deployId);

    /**
     * 手动部署processes目录文件
     *
     * @return
     */
    List<String> manualDeployment();

    void importByObs();

    /**
     * 预警工单启动流程实例
     *
     * @param procDefId 流程模板ID
     * @param variables 流程变量
     * @return
     */
    public R<FlowTaskDto> earlyWarningTicketsStart(String procDefId, Map<String, Object> variables);

}
